package handler

import (
	v1 "gin-vben-admin/api/v1"
	"gin-vben-admin/api/v1/errcode"
	"gin-vben-admin/internal/service"
	"github.com/gin-gonic/gin"
)

type LoginHandler struct {
	loginService service.LoginService
}

func NewLoginHandler(s service.LoginService) *LoginHandler {
	return &LoginHandler{loginService: s}
}

// Login 登陆
// @Summary 登陆
// @Description 登陆成功后返回token
// @Tags 登陆
// @param json body dto.LoginReq true "请求数据"
// @Accept json
// @Produce json
// @Response 200 {object} response.Response{data=dto.LoginRes}
// @Router /api/v1/login [post]
func (h *LoginHandler) Login(ctx *gin.Context) {
	req := v1.LoginReq{}
	if err := ctx.ShouldBindJSON(&req); err != nil {
		v1.Error(ctx, errcode.ErrBadRequest.Wrap(err))
		return
	}
	res, err := h.loginService.Login(ctx, &req)
	v1.Response(ctx, err, res)
}

// Logout 退出登陆
// @Summary 退出登陆
// @Tags 登陆
// @Produce json
// @Response 200 {object} response.Response
// @Router /api/v1/logout [get]
// @Security Bearer
func (h *LoginHandler) Logout(ctx *gin.Context) {
	_ = h.loginService.Logout(ctx, UserId(ctx))
	v1.Success(ctx, "success")
}

func (h *LoginHandler) RefreshToken(ctx *gin.Context) {
	req := v1.RefreshTokenReq{}
	if err := ctx.ShouldBindJSON(&req); err != nil {
		v1.Error(ctx, errcode.ErrBadRequest.Wrap(err))
		return
	}
	res, err := h.loginService.RefreshToken(ctx, &req)
	v1.Response(ctx, err, res)
}

func (h *LoginHandler) Profile(ctx *gin.Context) {
	res, err := h.loginService.Profile(ctx, UserId(ctx))
	v1.Response(ctx, err, res)
}

func (h *LoginHandler) GetMenuAndPermissions(ctx *gin.Context) {
	res, err := h.loginService.Profile(ctx, UserId(ctx))
	v1.Response(ctx, err, res)
}
